package model;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import workspace.Workspace;
import beans.Esemeny;
import beans.Eszkoz;
import beans.Foglalas;
import beans.Foglalo;
import beans.Operator;
import beans.Terem;
import beans.Tipus;

public class TeremnyilvantartasModel {

	private Workspace workspace;
	private TeremnyilvantartasProvider provider;
	private List<Foglalas> foglalasok;
	private List<Eszkoz> eszkozok;
	private List<Foglalo> foglalok;
	private List<Terem> termek;
	private List<Tipus> tipusok;
	private List<Esemeny> esemenyNaplo;
	private List<Operator> operatorok;
	private Terem aktualisTerem;
	private Calendar startNap;
	private Calendar legkorabbiStartNap;

	public void loadStartData() throws SQLException {
		provider = new TeremnyilvantartasProvider();
		startNap = Calendar.getInstance();
		startNap.set(Calendar.MILLISECOND, 0);
		startNap.set(Calendar.SECOND, 0);
		startNap.set(Calendar.MINUTE, 0);
		startNap.set(Calendar.HOUR_OF_DAY, 0);
		legkorabbiStartNap = Calendar.getInstance();
		legkorabbiStartNap.setTime(startNap.getTime());
		foglalasok = provider.loadMindenFoglalasNaptol(workspace, startNap);
		eszkozok = provider.loadMindenEszkoz(workspace);
		foglalok = provider.loadMindenFoglalo(workspace);
		esemenyNaplo = provider.loadEsemenyNaplo(workspace);
		termek = provider.loadMindenTerem(workspace);
		tipusok = provider.loadMindenTipus(workspace);
		operatorok = provider.loadOperatorLista(workspace);
		aktualisTerem = termek.size() > 0 ? termek.get(0) : null;
	}

	public void refreshAllData() throws SQLException {
		foglalasok = provider.loadMindenFoglalasNaptol(workspace, startNap);
		eszkozok = provider.loadMindenEszkoz(workspace);
		foglalok = provider.loadMindenFoglalo(workspace);
		esemenyNaplo = provider.loadEsemenyNaplo(workspace);
		termek = provider.loadMindenTerem(workspace);
		tipusok = provider.loadMindenTipus(workspace);
		operatorok = provider.loadOperatorLista(workspace);
	}

	public Map<Terem, List<Foglalas>> getFoglalasForNapiNezet() {
		Map<Terem, List<Foglalas>> eredmeny = new HashMap<Terem, List<Foglalas>>();
		for (Terem aktTerem : termek) {
			ArrayList<Foglalas> foglalasokForTerem = new ArrayList<Foglalas>();
			for (Foglalas foglalas : foglalasok) {
				if (azonosNaponVan(foglalas.getFromDate(), startNap)
						&& foglalas.getTerem().getId() == aktTerem.getId()) {
					foglalasokForTerem.add(foglalas);
				}
			}
			eredmeny.put(aktTerem, foglalasokForTerem);
		}
		return eredmeny;
	}

	public Map<Calendar, List<Foglalas>> getFoglalasForTeremNezet() {
		Map<Calendar, List<Foglalas>> eredmeny = new HashMap<Calendar, List<Foglalas>>();
		for (int i = 0; i < 14; i++) {
			Calendar tempCalendar = Calendar.getInstance();
			tempCalendar.setTime(startNap.getTime());
			tempCalendar.add(Calendar.DAY_OF_MONTH, i);
			ArrayList<Foglalas> foglalasokForNap = new ArrayList<Foglalas>();
			for (Foglalas foglalas : foglalasok) {
				if (azonosNaponVan(foglalas.getFromDate(), tempCalendar)
						&& foglalas.getTerem().getId() == aktualisTerem.getId()) {
					foglalasokForNap.add(foglalas);
				}
			}
			eredmeny.put(tempCalendar, foglalasokForNap);
		}
		return eredmeny;
	}

	public Workspace getWorkspace() {
		return workspace;
	}

	public void setWorkspace(Workspace workspace) {
		this.workspace = workspace;
	}

	public TeremnyilvantartasProvider getProvider() {
		return provider;
	}

	public void setProvider(TeremnyilvantartasProvider provider) {
		this.provider = provider;
	}

	public List<Foglalas> getFoglalasok() {
		return foglalasok;
	}

	public void setFoglalasok(List<Foglalas> foglalasok) {
		this.foglalasok = foglalasok;
	}

	public List<Eszkoz> getEszkozok() {
		return eszkozok;
	}

	public void setEszkozok(List<Eszkoz> eszkozok) {
		this.eszkozok = eszkozok;
	}

	public List<Foglalo> getFoglalok() {
		return foglalok;
	}

	public void setFoglalok(List<Foglalo> foglalok) {
		this.foglalok = foglalok;
	}

	public List<Terem> getTermek() {
		return termek;
	}

	public void setTermek(List<Terem> termek) {
		this.termek = termek;
	}

	public List<Tipus> getTipusok() {
		return tipusok;
	}

	public void setTipusok(List<Tipus> tipusok) {
		this.tipusok = tipusok;
	}

	public List<Esemeny> getEsemenyNaplo() {
		return esemenyNaplo;
	}

	public void setEsemenyNaplo(List<Esemeny> esemenyNaplo) {
		this.esemenyNaplo = esemenyNaplo;
	}

	public Terem getAktualisTerem() {
		return aktualisTerem;
	}

	public void setAktualisTerem(Terem aktualisTerem) {
		this.aktualisTerem = aktualisTerem;
	}

	public Calendar getStartNap() {
		return startNap;
	}

	public void setStartNap(Calendar startNap) throws SQLException {
		if (startNap.compareTo(legkorabbiStartNap) < 0) {
			this.foglalasok.clear();
			this.foglalasok = provider.loadMindenFoglalasNaptol(workspace,
					startNap);
		}
		this.startNap = startNap;
	}

	private boolean azonosNaponVan(Calendar firstCalendar,
			Calendar secondCalendar) {
		boolean eredmeny = false;
		if ((firstCalendar.get(Calendar.DAY_OF_MONTH) == secondCalendar
				.get(Calendar.DAY_OF_MONTH))
				&& (firstCalendar.get(Calendar.MONTH) == secondCalendar
						.get(Calendar.MONTH))
				&& (firstCalendar.get(Calendar.YEAR) == secondCalendar
						.get(Calendar.YEAR))) {
			eredmeny = true;
		}
		return eredmeny;
	}

	public void refreshEsemenyNaplo() throws SQLException {
		esemenyNaplo = provider.loadEsemenyNaplo(workspace);

	}

	public List<Operator> getOperatorok() {
		return operatorok;
	}

	public void refreshTermek() throws SQLException {
		esemenyNaplo = provider.loadEsemenyNaplo(workspace);
		termek = provider.loadMindenTerem(workspace);
	}

	public void refreshFoglalok() throws SQLException {
		esemenyNaplo = provider.loadEsemenyNaplo(workspace);
		foglalok = provider.loadMindenFoglalo(workspace);
	}

	public void refreshFoglalasok() throws SQLException {
		esemenyNaplo = provider.loadEsemenyNaplo(workspace);
		foglalasok = provider.loadMindenFoglalasNaptol(workspace, startNap);
	}

}
